<?php

namespace app\helps;
use app\facade\Redis;
use think\Db;

class MoneyHelperBaser  {
    //1 奖金（直推/团队）
    const TYPE_BONUS = 1;
    //2 兑换券
    const TYPE_VOLUME = 2;
    // 3 合约收益
    const TYPE_CONTRACT = 3;
    //4 MT
    const TYPE_MT = 4;

    /**
     * 奖金类型 直推
     */
    const PROFIT_TYPE_CHILD = 1;
    /**
     * 奖金类型 团队
     */
    const PROFIT_TYPE_TEAM = 2;

    /**
     * mt 冻结
     */
    const FILED_MT_FORZE = "mt_forze";

    /**
     * mt
     */
    const FILED_MT = "mt";
    /**
     * 兑换券
     */
    const FILED_VOLUME= "volume";
    /**
     * 奖金
     */
    const FILED_INCOME= "income";

    /**
     * 合约收益字段
     */
    const FILED_CONTRACT_COME= "contract_come";


    /**
     * 操作类型 兑换券-商城购买
     */
    const OP_TYPE_VOLUME_SHOP_BUY = 101;
    /**
     * 操作类型 兑换券-充值
     */
    const OP_TYPE_VOLUME_RECHARGE = 102;

    /**
     * 操作类型 兑换券-转赠给别人
     */
    const OP_TYPE_VOLUME_TRANSFER_FROM = 103;

    /**
     * 操作类型 兑换券-接受别人转赠
     */
    const OP_TYPE_VOLUME_TRANSFER_TO = 104;

    /**
     * MT 兑换兑换券
     */
    const OP_TYPE_VOLUME_FROM_MT=105;

    /**
     * 奖金兑换兑换券
     */
    const OP_TYPE_VOLUME_FROM_INCOME=106;

    /**
     * 合约收益 兑换兑换券
     */
    const OP_TYPE_VOLUME_FROM_CONTRACT=107;

    /**
     * 九宫格抽奖励
     */
    const OP_TYPE_VOLUME_AWARD=108;

    /**
     * 操作类型 MT -充值
     */
    const OP_TYPE_MT_RECHARGE= 202;

    /**
     * 操作类型 MT-转赠给别人
     */
    const OP_TYPE_MT_TRANSFER_FROM = 203;

    /**
     * 操作类型 MT-接受别人转赠
     */
    const OP_TYPE_MT_TRANSFER_TO = 204;


    /**
     * 操作类型 MT 兑换 兑换券
     */
    const OP_TYPE_MT_TO_VOLUME= 205;

    /**
     * 操作类型 MT 挂卖 手续费
     */
    const OP_TYPE_MT_SELL_FEE= 206;

    /**
     * 操作类型 MT 挂卖 冻结数量
     */
    const OP_TYPE_MT_SELL_FROZEN= 207;

    /**
     * 操作类型 MT 挂卖 取消
     */
    const OP_TYPE_MT_SELL_CANCLE= 208;

    /**
     * 操作类型 MT 挂卖 成功
     */
    const OP_TYPE_MT_SELL_SUC= 209;

    /**
     * 操作类型 MT 收益
     */
    const OP_TYPE_MT_PROFIT= 210;

    /**
     * 操作类型 MT 没有中奖赠送
     */
    const OP_TYPE_MT_BOOK_FAIL= 211;

    /**
     * 操作类型 MT 没有中奖赠送
     */
    const OP_TYPE_MT_SIGN= 212;

    /**
     * 操作类型 MT 换购商品口MT
     */
    const OP_TYPE_MT_FEE= 213;

    /**
     * 操作类型 MT 9宫格开奖
     */
    const OP_TYPE_MT_AWARD= 214;


    /**
     * 操作类型 income 团队收益
     */
    const OP_TYPE_INCOME_TEAM= 301;

    /**
     * 操作类型 income 直推收益
     */
    const OP_TYPE_INCOME_CHILD= 302;

    /**
     * 操作类型 income 换购商品
     */
    const OP_TYPE_INCOME_TO_GOODS= 303;

    /**
     * 操作类型 income 换购兑换券
     */
    const OP_TYPE_INCOME_TO_VOLUME= 304;

    /**
     * 操作类型 合约收益 发放
     */
    const OP_TYPE_CONTRACT_PROFIT= 401;

    /**
     * 操作类型 合约收益 换购商品
     */
    const OP_TYPE_CONTRACT_TO_GOODS= 403;

    /**
     * 操作类型 合约收益 换购兑换券
     */
    const OP_TYPE_CONTRACT_TO_VOLUME= 404;


    /**
     * 操作类型 后台管理员操作用户金额
     */
    const OP_TYPE_SYS= 901;

    /**
     * 后台管理员操作用户金额
     * @param $user 发放收益用户
     * @param $num  数量
     * @param $volume 备注
     */
    public function sysUser($user,$num,$filed_name){
        $type = self::TYPE_BONUS;
        $op_type =self::OP_TYPE_SYS;
        if ($filed_name==self::FILED_INCOME){
            $type = self::TYPE_BONUS;
        }else if ($filed_name==self::FILED_MT){
            $type = self::TYPE_MT;
        }else if ($filed_name==self::FILED_VOLUME){
            $type = self::TYPE_VOLUME;
        }else if ($filed_name==self::FILED_CONTRACT_COME){
            $type = self::TYPE_CONTRACT;
        }else{
            return "filed_name 不支持";
        }
        if ($num==0){
            return "冲账金额不能为0";
        }
        if ($num>0){
            $msg="系统赠送".$num;
        }else{
            $msg="系统扣除".$num;
        }
        $absNum = abs($num);
        if ($num>0){
            $res = $this->addUserMoneyAndRecord($user,$absNum,$filed_name,$msg,$type,$op_type,0);
            if ($res!=1){
                return $res;
            }
        }else{
            $res = $this->reduceUserMoneyAndRecord($user,$absNum,$filed_name,$msg,$type,$op_type,0);
            if ($res!=1){
                return $res;
            }
        }
        return 1;
    }


    /**
     * 资金变动记录表
     * @param $num 带符号
     * @param $type 1 奖金（直推/团队）2 兑换券 3 合约收益 4 MT
     * @param $mark  备注
     * @param int $profit_type （1 直推收益 2 团队收益 0 不是收益类型）
     * @return int|string
     */
    protected function createUserMoneyRecord($user,$money_before,$filed,$num,$type,$mark,$op_type,$profit_type=0){
        $data =[];
        $data["num"]=$num;
        //1 奖金（直推/团队）2 兑换券 3 合约收益 4 MT
        $data["type"]=$type;
        //1 直推收益 2 团队收益 0 不是收益类型
        $data["profit_type"]=$profit_type;
        $data["mark"]=$mark;
        $data["uid"]=$user["id"];
        $data["username"]=$user["username"];;
        $data["op_type"]=$op_type;
        $data["money_before"]=$money_before;
        $data["money_after"]=($money_before+$num);
        $data["feild_name"]=$filed;
        $data["positive"]=$num>0? 1 :0;
        $data["time"]=date('Y-m-d H:i:s');
        return Db::table("tb_mt_user_record")->insert($data);

    }

    /**
     * @param $user
     * @param $num
     * @param $filed
     * @param $msgstr
     * @param $op_type
     * @param $profit_type
     * @return int|true
     * @throws \think\Exception
     */
    protected function reduceUserMoneyAndRecord($user,$num,$filed,$msgStr,$type,$op_type,$profit_type){
        $beformoney = $user[$filed];
        $res = Db::table("tb_user")->where("id",$user["id"])->setDec($filed,$num);
        if (!$res){
            return "操作".$filed.":-".$num."失败";
        }
        $mtFrozenRecord =$this->createUserMoneyRecord($user,$beformoney,$filed,-$num,$type,$msgStr,$op_type,$profit_type);
        if (!$mtFrozenRecord){
            return "操作".$filed.":-".$num."资金记录失败";
        }
        return 1;
    }

    /**
     * @param $user
     * @param $num
     * @param $filed
     * @param $msgstr
     * @param $op_type
     * @param $profit_type
     * @return int|true
     * @throws \think\Exception
     */
    protected function addUserMoneyAndRecord($user,$num,$filed,$msgStr,$type,$op_type,$profit_type){
        $beformoney = $user[$filed];
        $res = Db::table("tb_user")->where("id",$user["id"])->setInc($filed,$num);
        if (!$res){
            return "操作".$filed.":+".$num."失败";
        }
        $mtFrozenRecord =$this->createUserMoneyRecord($user,$beformoney,$filed,$num,$type,$msgStr,$op_type,$profit_type);
        if (!$mtFrozenRecord){
            return "操作".$filed.":+".$num."资金记录失败";
        }
        return 1;
    }

    /**
     * 增加用户字段金额
     * @param $uid 用户id
     * @param $filed 用户字段变量
     * @param $num 数量
     * @throws \think\Exception
     */
    protected function addUserMoney($uid,$filed,$num){
       return Db::table("tb_user")->where("id",$uid)->setInc($filed,$num);
    }

    /**
     * 减少用户字段金额
     * @param $uid 用户id
     * @param $filed 用户字段变量
     * @param $num 数量
     * @throws \think\Exception
     */
    protected function reduceUserMoney($uid,$filed,$num){
        return Db::table("tb_user")->where("id",$uid)->setDec($filed,$num);
    }

}